home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 8 / FM Towns Free Software Collection 8.iso / t_os / otohime / src / oteff1.c < prev    next >
Text File  |  1994-06-01  |  32KB  |  1,187 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <winb.h>
  5. #include <te.h>
  6. #include <fntb.h>
  7. #include <gui.h>
  8. #include <file_dlg.h>
  9. #include <egb.h>
  10. #include <mos.h>
  11. #include <snd.h>
  12. #include "otohime.h"
  13. #include "otolib.h"
  14.  
  15. /* echo */
  16. int    echoDialogId = -1 ;
  17. int    echoOkBtnId = -1 ;
  18. int    echoPlayBtnId = -1 ;
  19. int    echoUndoBtnId = -1 ;
  20. int    echoInfBtnId = -1 ;
  21. int    echoCanBtnId = -1 ;
  22. int    echoMesId[32] = -1 ;
  23. int    echoSubDialogId = -1 ;
  24. int    echoDelayVolumeId = -1 ;
  25. int    echoDelayNumId = -1 ;
  26. int    echoMainMixVolumeId = -1 ;
  27. int    echoMainMixNumId = -1 ;
  28. int    echoDelayMixVolumeId = -1 ;
  29. int    echoDelayMixNumId = -1 ;
  30. int    echoDecVolumeId = -1 ;
  31. int    echoDecNumId = -1 ;
  32. int    echoCountNumId = -1 ;
  33. int    echoAfterNumId = -1 ;
  34.  
  35. /* phase */
  36. int    phaseDialogId = -1 ;
  37. int    phaseOkBtnId = -1 ;
  38. int    phasePlayBtnId = -1 ;
  39. int    phaseUndoBtnId = -1 ;
  40. int    phaseInfBtnId = -1 ;
  41. int    phaseCanBtnId = -1 ;
  42. int    phaseMesId[30] = -1 ;
  43. int    phaseSubDialogId = -1 ;
  44. int    phaseDelayNumId = -1 ;
  45. int    phaseMainMixVolumeId = -1 ;
  46. int    phaseDelayMixVolumeId = -1 ;
  47. int    phaseModu1NumId = -1 ;
  48. int    phaseSpeed1NumId = -1 ;
  49. int    phaseStart1NumId = -1 ;
  50. int    phaseModu2NumId = -1 ;
  51. int    phaseSpeed2NumId = -1 ;
  52. int    phaseStart2NumId = -1 ;
  53. int    phaseDelayVolumeId = -1 ;
  54. int    phaseMainMixNumId = -1 ;
  55. int    phaseDelayMixNumId = -1 ;
  56.  
  57. /* vibrato */
  58. int    vibraDialogId = -1 ;
  59. int    vibraOkBtnId = -1 ;
  60. int    vibraPlayBtnId = -1 ;
  61. int    vibraUndoBtnId = -1 ;
  62. int    vibraInfBtnId = -1 ;
  63. int    vibraCanBtnId = -1 ;
  64. int    vibraMesId[19] = -1 ;
  65. int    vibraSubDialogId = -1 ;
  66. int    vibraMainMixVolumeId = -1 ;
  67. int    vibraMainMixNumId = -1 ;
  68. int    vibraDelayMixVolumeId = -1 ;
  69. int    vibraDelayMixNumId = -1 ;
  70. int    vibraModu1NumId = -1 ;
  71. int    vibraStart1NumId = -1 ;
  72. int    vibraModu2NumId = -1 ;
  73. int    vibraSpeed2NumId = -1 ;
  74. int    vibraStart2NumId = -1 ;
  75. int    vibraSpeed1NumId = -1 ;
  76.  
  77. /* tremolo */
  78. int    tremoDialogId = -1 ;
  79. int    tremoOkBtnId = -1 ;
  80. int    tremoPlayBtnId = -1 ;
  81. int    tremoUndoBtnId = -1 ;
  82. int    tremoInfBtnId = -1 ;
  83. int    tremoCanBtnId = -1 ;
  84. int    tremoMesId[18] = -1 ;
  85. int    tremoSubDialogId = -1 ;
  86. int    tremoMainMixVolumeId = -1 ;
  87. int    tremoMainMixNumId = -1 ;
  88. int    tremoTremoMixVolumeId = -1 ;
  89. int    tremoTremoMixNumId = -1 ;
  90. int    tremoSpeedNumId = -1 ;
  91. int    tremoSpeedVolumeId = -1 ;
  92.  
  93.  
  94. /* ECHO */
  95.  
  96. int    sndEffectEcho()
  97. {
  98.     MMI_SendMessage( echoDialogId, MM_ATTACH, 1, MMI_GetBaseObj() ) ;
  99.     MMI_SendMessage( echoDialogId, MM_SHOW, 0 ) ;    /* 全体を見せる */
  100.  
  101.     MMI_ExecSystem() ;        /* Dialog表示へ・・・イベントループ */
  102.  
  103.     MMI_SendMessage( echoDialogId, MM_ERASE, 0 ) ;
  104.     MMI_SendMessage( echoDialogId, MM_DETACH, 0 ) ;
  105.  
  106.     return NOERR ;
  107. }
  108.  
  109. /*    initDataIOTECH:echoOkBtnId:MJ_DBUTTONL40の呼び出し関数    */
  110. int    echoOkchk(kobj, messId, argc, pev, trigger)
  111. int        kobj ;
  112. int        messId ;
  113. int        argc ;
  114. EVENT    *pev ;
  115. int        trigger ;
  116. {
  117.     SNDHEAD *head ;
  118.     int    var, min, max, delta, ptColumn ;
  119.     int delay, mainmix, delmix, decrate, count, after, f ;
  120.     int ret ;
  121.  
  122.     setMsgColor( echoMesId[0], EXE_COLOR ) ;
  123.  
  124.     head = (SNDHEAD *)sndBuf2 ;
  125.     f = ( head->freq ) * 1000 / 0x62 ;                /* freq */
  126.     f = ( f + 50 )/100 * 100 ;                /* 10の位を四捨五入 */
  127.  
  128.     MMI_SendMessage( echoDelayNumId, MM_GETNUMBOX, 5,    /* delay */
  129.                         &var, &min, &max, &delta, &ptColumn ) ;
  130.     delay = f * var / 1000 ;
  131.  
  132.     MMI_SendMessage( echoMainMixNumId, MM_GETNUMBOX, 5,    /* main mix */
  133.                         &var, &min, &max, &delta, &ptColumn ) ;
  134.     mainmix = var * 256 / 100 ;
  135.  
  136.     MMI_SendMessage( echoDelayMixNumId, MM_GETNUMBOX, 5,    /* delay mix */
  137.                         &var, &min, &max, &delta, &ptColumn ) ;
  138.     delmix = var * 256 / 100 ;
  139.  
  140.     MMI_SendMessage( echoDecNumId, MM_GETNUMBOX, 5,    /* 減衰率 */
  141.                         &var, &min, &max, &delta, &ptColumn ) ;
  142.     decrate = var * 256 / 100 ;
  143.  
  144.     MMI_SendMessage( echoCountNumId, MM_GETNUMBOX, 5,    /* 減衰率 */
  145.                         &var, &min, &max, &delta, &ptColumn ) ;
  146.     count = var ;
  147.  
  148.     MMI_SendMessage( echoAfterNumId, MM_GETNUMBOX, 5,    /* 余韻 */
  149.                         &var, &min, &max, &delta, &ptColumn ) ;
  150.     after = f * var / 1000 ;
  151.  
  152. //    if( ( 32 + (head->length) + after ) > sndBufSize )
  153. //        after = sndBufSize - 32 - (head->length) ;
  154.  
  155.     ret = sndEcho( delay, mainmix, delmix, decrate, count, after ) ;
  156.     if( ret )
  157.         errorCheck( ret ) ;
  158.  
  159.     setMsgColor( echoMesId[0], MOJI_COLOR ) ;
  160.  
  161.     MMI_FlushEvnt() ;    /* イベントをフラッシュ */
  162.  
  163.     return NOERR ;
  164. }
  165.  
  166. /*    initDataIOTECH:echoPlayBtnId:MJ_DBUTTONL40の呼び出し関数    */
  167. int    echoPlay(kobj, messId, argc, pev, trigger)
  168. int        kobj ;
  169. int        messId ;
  170. int        argc ;
  171. EVENT    *pev ;
  172. int        trigger ;
  173. {
  174.     setMsgColor( echoMesId[1], EXE_COLOR ) ;
  175.  
  176.     sndPlay() ;
  177.  
  178.     setMsgColor( echoMesId[1], MOJI_COLOR ) ;
  179.  
  180.     return NOERR ;
  181. }
  182.  
  183. /*    initDataIOTECH:echoUndoBtnId:MJ_DBUTTONL40の呼び出し関数    */
  184. int    echoUndo(kobj, messId, argc, pev, trigger)
  185. int        kobj ;
  186. int        messId ;
  187. int        argc ;
  188. EVENT    *pev ;
  189. int        trigger ;
  190. {
  191.     setMsgColor( echoMesId[2], EXE_COLOR ) ;
  192.  
  193.     unDo() ;
  194.  
  195.     setMsgColor( echoMesId[2], MOJI_COLOR ) ;
  196.  
  197.     MMI_FlushEvnt() ;    /* イベントをフラッシュ */
  198.  
  199.     return NOERR ;
  200. }
  201.  
  202. /*    initDataIOTECH:echoInfBtnId:MJ_DBUTTONL40の呼び出し関数    */
  203. int    echoInf(kobj, messId, argc, pev, trigger)
  204. int        kobj ;
  205. int        messId ;
  206. int        argc ;
  207. EVENT    *pev ;
  208. int        trigger ;
  209. {
  210.     /* ダイアログを使えないようにする */
  211.     MTL_setAtrObj( echoDialogId, MS_DSPONLYL40 ) ;
  212.  
  213.     sndInf() ;
  214.  
  215.     /* ダイアログを使えるように戻す */
  216.     MTL_resetAtrObj( echoDialogId, (~MS_DSPONLYL40) ) ;
  217.     return NOERR ;
  218. }
  219.  
  220. /*    initDataIOTECH:echoCanBtnId:MJ_DBUTTONL40の呼び出し関数    */
  221. int    echoCanchk(kobj, messId, argc, pev, trigger)
  222. int        kobj ;
  223. int        messId ;
  224. int        argc ;
  225. EVENT    *pev ;
  226. int        trigger ;
  227. {
  228.     MMI_SetHaltFlag( TRUE ) ;
  229.     return NOERR ;
  230. }
  231.  
  232. /*    initDataIOTECH:echoDelayVolumeId:MJ_SCRLL40の呼び出し関数    */
  233. /*    initDataIOTECH:echoDelayNumId:MJ_NUMBOXL40の呼び出し関数    */
  234. int    echoDelaySet(kobj, messId, argc, pev, trigger)
  235. int        kobj ;
  236. int        messId ;
  237. int        argc ;
  238. EVENT    *pev ;
  239. int        trigger ;
  240. {
  241.     /* ボリュームは1/2 */
  242.  
  243.     int    var, min, max, len, page ;            /* スクロールの変数 */
  244.     int    var2, min2, max2, delta2, ptColumn2 ;    /* 数値設定の変数 */
  245.  
  246.     if( kobj == echoDelayVolumeId )
  247.     {
  248.         MMI_SendMessage( kobj, MM_GETSCROLL, 5,
  249.                                         &var, &min, &max, &len, &page ) ;
  250.         MMI_SendMessage( echoDelayNumId, MM_GETNUMBOX, 5,
  251.                             &var2, &min2, &max2, &delta2, &ptColumn2 ) ;
  252.         MMI_SendMessage( echoDelayNumId, MM_SETNUMBOX, 5,
  253.                             var*2, min2, max2, delta2, ptColumn2 ) ;
  254.         MMI_SendMessage( echoDelayNumId, MM_SHOW, 0 ) ;
  255.     }
  256.  
  257.     if( kobj == echoDelayNumId )
  258.     {
  259.         MMI_SendMessage( kobj, MM_GETNUMBOX, 5,
  260.                             &var2, &min2, &max2, &delta2, &ptColumn2 ) ;
  261.         MMI_SendMessage( echoDelayVolumeId, MM_GETSCROLL, 5,
  262.                                         &var, &min, &max, &len, &page ) ;
  263.         if( var2 > 500 )var2 = 500 ;
  264.         MMI_SendMessage( echoDelayVolumeId, MM_SETSCROLL, 5,
  265.                                         var2/2, min, max, len, page ) ;
  266.         MMI_SendMessage( echoDelayVolumeId, MM_SHOW, 0 ) ;
  267.     }
  268.  
  269.     return NOERR ;
  270. }
  271.  
  272. /*    initDataIOTECH:echoMainMixVolumeId:MJ_SCRLL40の呼び出し関数    */
  273. /*    initDataIOTECH:echoMainMixNumId:MJ_NUMBOXL40の呼び出し関数    */
  274. int    echoMainMixSet(kobj, messId, argc, pev, trigger)
  275. int        kobj ;
  276. int        messId ;
  277. int        argc ;
  278. EVENT    *pev ;
  279. int        trigger ;
  280. {
  281.     int    var, min, max, len, page ;            /* スクロールの変数 */
  282.     int    var2, min2, max2, delta2, ptColumn2 ;    /* 数値設定の変数 */
  283.  
  284.     if( kobj == echoMainMixVolumeId )
  285.     {
  286.         MMI_SendMessage( kobj, MM_GETSCROLL, 5,
  287.                                         &var, &min, &max, &len, &page ) ;
  288.         MMI_SendMessage( echoMainMixNumId, MM_GETNUMBOX, 5,
  289.                             &var2, &min2, &max2, &delta2, &ptColumn2 ) ;
  290.         MMI_SendMessage( echoMainMixNumId, MM_SETNUMBOX, 5,
  291.                             var, min2, max2, delta2, ptColumn2 ) ;
  292.         MMI_SendMessage( echoMainMixNumId, MM_SHOW, 0 ) ;
  293.     }
  294.  
  295.     if( kobj == echoMainMixNumId )
  296.     {
  297.         MMI_SendMessage( kobj, MM_GETNUMBOX, 5,
  298.                             &var2, &min2, &max2, &delta2, &ptColumn2 ) ;
  299.         MMI_SendMessage( echoMainMixVolumeId, MM_GETSCROLL, 5,
  300.                                         &var, &min, &max, &len, &page ) ;
  301.         MMI_SendMessage( echoMainMixVolumeId, MM_SETSCROLL, 5,
  302.                                         var2, min, max, len, page ) ;
  303.         MMI_SendMessage( echoMainMixVolumeId, MM_SHOW, 0 ) ;
  304.     }
  305.  
  306.     return NOERR ;
  307. }
  308.  
  309. /*    initDataIOTECH:echoDelayMixVolumeId:MJ_SCRLL40の呼び出し関数    */
  310. /*    initDataIOTECH:echoDelayMixNumId:MJ_NUMBOXL40の呼び出し関数    */
  311. int    echoDelayMixSet(kobj, messId, argc, pev, trigger)
  312. int        kobj ;
  313. int        messId ;
  314. int        argc ;
  315. EVENT    *pev ;
  316. int        trigger ;
  317. {
  318.     int    var, min, max, len, page ;            /* スクロールの変数 */
  319.     int    var2, min2, max2, delta2, ptColumn2 ;    /* 数値設定の変数 */
  320.  
  321.     if( kobj == echoDelayMixVolumeId )
  322.     {
  323.         MMI_SendMessage( kobj, MM_GETSCROLL, 5,
  324.                                         &var, &min, &max, &len, &page ) ;
  325.         MMI_SendMessage( echoDelayMixNumId, MM_GETNUMBOX, 5,
  326.                             &var2, &min2, &max2, &delta2, &ptColumn2 ) ;
  327.         MMI_SendMessage( echoDelayMixNumId, MM_SETNUMBOX, 5,
  328.                             var, min2, max2, delta2, ptColumn2 ) ;
  329.         MMI_SendMessage( echoDelayMixNumId, MM_SHOW, 0 ) ;
  330.     }
  331.  
  332.     if( kobj == echoDelayMixNumId )
  333.     {
  334.         MMI_SendMessage( kobj, MM_GETNUMBOX, 5,
  335.                             &var2, &min2, &max2, &delta2, &ptColumn2 ) ;
  336.         MMI_SendMessage( echoDelayMixVolumeId, MM_GETSCROLL, 5,
  337.                                         &var, &min, &max, &len, &page ) ;
  338.         MMI_SendMessage( echoDelayMixVolumeId, MM_SETSCROLL, 5,
  339.                                         var2, min, max, len, page ) ;
  340.         MMI_SendMessage( echoDelayMixVolumeId, MM_SHOW, 0 ) ;
  341.     }
  342.  
  343.     return NOERR ;
  344. }
  345.  
  346. /*    initDataIOTECH:echoDecVolumeId:MJ_SCRLL40の呼び出し関数    */
  347. /*    initDataIOTECH:echoDecNumId:MJ_NUMBOXL40の呼び出し関数    */
  348. int    echoDecSet(kobj, messId, argc, pev, trigger)
  349. int        kobj ;
  350. int        messId ;
  351. int        argc ;
  352. EVENT    *pev ;
  353. int        trigger ;
  354. {
  355.     int    var, min, max, len, page ;            /* スクロールの変数 */
  356.     int    var2, min2, max2, delta2, ptColumn2 ;    /* 数値設定の変数 */
  357.  
  358.     if( kobj == echoDecVolumeId )
  359.     {
  360.         MMI_SendMessage( kobj, MM_GETSCROLL, 5,
  361.                                         &var, &min, &max, &len, &page ) ;
  362.         MMI_SendMessage( echoDecNumId, MM_GETNUMBOX, 5,
  363.                             &var2, &min2, &max2, &delta2, &ptColumn2 ) ;
  364.         MMI_SendMessage( echoDecNumId, MM_SETNUMBOX, 5,
  365.                             var, min2, max2, delta2, ptColumn2 ) ;
  366.         MMI_SendMessage( echoDecNumId, MM_SHOW, 0 ) ;
  367.     }
  368.  
  369.     if( kobj == echoDecNumId )
  370.     {
  371.         MMI_SendMessage( kobj, MM_GETNUMBOX, 5,
  372.                             &var2, &min2, &max2, &delta2, &ptColumn2 ) ;
  373.         MMI_SendMessage( echoDecVolumeId, MM_GETSCROLL, 5,
  374.                                         &var, &min, &max, &len, &page ) ;
  375.         MMI_SendMessage( echoDecVolumeId, MM_SETSCROLL, 5,
  376.                                         var2, min, max, len, page ) ;
  377.         MMI_SendMessage( echoDecVolumeId, MM_SHOW, 0 ) ;
  378.     }
  379.  
  380.     return NOERR ;
  381. }
  382.  
  383.  
  384. /*    PHASE */
  385.  
  386. int    sndEffectPhaseShift()
  387. {
  388.     MMI_SendMessage( phaseDialogId, MM_ATTACH, 1, MMI_GetBaseObj() ) ;
  389.     MMI_SendMessage( phaseDialogId, MM_SHOW, 0 ) ;    /* 全体を見せる */
  390.  
  391.     MMI_ExecSystem() ;        /* Dialog表示へ・・・イベントループ */
  392.  
  393.     MMI_SendMessage( phaseDialogId, MM_ERASE, 0 ) ;
  394.     MMI_SendMessage( phaseDialogId, MM_DETACH, 0 ) ;
  395.  
  396.     return NOERR ;
  397. }
  398.  
  399. /*    initDataIOTPHA:phasePlayBtnId:MJ_DBUTTONL40の呼び出し関数    */
  400. int    phasePlay(kobj, messId, argc, pev, trigger)
  401. int        kobj ;
  402. int        messId ;
  403. int        argc ;
  404. EVENT    *pev ;
  405. int        trigger ;
  406. {
  407.     setMsgColor( phaseMesId[1], EXE_COLOR ) ;
  408.  
  409.     sndPlay() ;
  410.  
  411.     setMsgColor( phaseMesId[1], MOJI_COLOR ) ;
  412.  
  413.     return NOERR ;
  414. }
  415.  
  416. /*    initDataIOTPHA:phaseOkBtnId:MJ_DBUTTONL40の呼び出し関数    */
  417. int    phaseOkchk(kobj, messId, argc, pev, trigger)
  418. int        kobj ;
  419. int        messId ;
  420. int        argc ;
  421. EVENT    *pev ;
  422. int        trigger ;
  423. {
  424.     SNDHEAD *head ;
  425.     char para[64] ;
  426.     char work[512] ;
  427.     int    var, min, max, delta, ptColumn ;
  428.  
  429.     setMsgColor( phaseMesId[0], EXE_COLOR ) ;
  430.  
  431.     head = (SNDHEAD *)sndBuf2 ;
  432.  
  433.     DWORD( para + 0 ) = 0 ;
  434.     MMI_SendMessage( phaseDelayNumId, MM_GETNUMBOX, 5,    /* delay */
  435.                         &var, &min, &max, &delta, &ptColumn ) ;
  436.     DWORD( para + 4 ) = var ;
  437.     MMI_SendMessage( phaseMainMixNumId, MM_GETNUMBOX, 5,    /* main mix */
  438.                         &var, &min, &max, &delta, &ptColumn ) ;
  439.     DWORD( para + 8 ) = var * 256 / 100 ;
  440.     MMI_SendMessage( phaseDelayMixNumId, MM_GETNUMBOX, 5,    /* delay mix */
  441.                         &var, &min, &max, &delta, &ptColumn ) ;
  442.     DWORD( para + 12 ) = var * 256 / 100 ;
  443.     MMI_SendMessage( phaseModu1NumId, MM_GETNUMBOX, 5,        /* modu1 */
  444.                         &var, &min, &max, &delta, &ptColumn ) ;
  445.     DWORD( para + 16 ) = var ;
  446.     MMI_SendMessage( phaseSpeed1NumId, MM_GETNUMBOX, 5,        /* speed1 */
  447.                         &var, &min, &max, &delta, &ptColumn ) ;
  448.     DWORD( para + 20 )
  449.     = (double)var / 100 * 65536 * 4 / (head->freq * 1000 / 0x62) ;
  450.  
  451.     MMI_SendMessage( phaseStart1NumId, MM_GETNUMBOX, 5,        /* start1 */
  452.                         &var, &min, &max, &delta, &ptColumn ) ;
  453.     DWORD( para + 24 ) = var * 65536 / 90 + 65535*3 ;
  454.  
  455.     MMI_SendMessage( phaseModu2NumId, MM_GETNUMBOX, 5,        /* modu2 */
  456.                         &var, &min, &max, &delta, &ptColumn ) ;
  457.     DWORD( para + 28 ) = var ;
  458.     MMI_SendMessage( phaseSpeed2NumId, MM_GETNUMBOX, 5,        /* speed2 */
  459.                         &var, &min, &max, &delta, &ptColumn ) ;
  460.     DWORD( para + 32 )
  461.     = (double)var / 100 * 65536 * 4 / (head->freq * 1000 / 0x62) ;
  462.  
  463.     MMI_SendMessage( phaseStart2NumId, MM_GETNUMBOX, 5,        /* start2 */
  464.                         &var, &min, &max, &delta, &ptColumn ) ;
  465.     DWORD( para + 36 ) = var * 65536 / 90 + 65535*3 ;
  466.  
  467.     sndPhaseDelay( sndBuf2, sndBuf1, para, work ) ;
  468.  
  469.     setMsgColor( phaseMesId[0], MOJI_COLOR ) ;
  470.  
  471.     MMI_FlushEvnt() ;    /* イベントをフラッシュ */
  472.  
  473.     return NOERR ;
  474. }
  475.  
  476. /*    initDataIOTPHA:phaseCanBtnId:MJ_DBUTTONL40の呼び出し関数    */
  477. int    phaseCanchk(kobj, messId, argc, pev, trigger)
  478. int        kobj ;
  479. int        messId ;
  480. int        argc ;
  481. EVENT    *pev ;
  482. int        trigger ;
  483. {
  484.     MMI_SetHaltFlag( TRUE ) ;
  485.     return NOERR ;
  486. }
  487.  
  488. /*    initDataIOTPHA:phaseDelayNumId:MJ_NUMBOXL40の呼び出し関数    */
  489. /*    initDataIOTPHA:phaseDelayVolumeId:MJ_SCRLL40の呼び出し関数    */
  490. int    phaseDelaySet(kobj, messId, argc, pev, trigger)
  491. int        kobj ;
  492. int        messId ;
  493. int        argc ;
  494. EVENT    *pev ;
  495. int        trigger ;
  496. {
  497.     /* vol.は実際の数値の1/2 */
  498.  
  499.     int    var, min, max, len, page ;            /* スクロールの変数 */
  500.     int    var2, min2, max2, delta2, ptColumn2 ;    /* 数値設定の変数 */
  501.  
  502.     if( kobj == phaseDelayVolumeId )
  503.     {
  504.         MMI_SendMessage( kobj, MM_GETSCROLL, 5,
  505.                                         &var, &min, &max, &len, &page ) ;
  506.         MMI_SendMessage( phaseDelayNumId, MM_GETNUMBOX, 5,
  507.                             &var2, &min2, &max2, &delta2, &ptColumn2 ) ;
  508.         MMI_SendMessage( phaseDelayNumId, MM_SETNUMBOX, 5,
  509.                             var*2, min2, max2, delta2, ptColumn2 ) ;
  510.         MMI_SendMessage( phaseDelayNumId, MM_SHOW, 0 ) ;
  511.     }
  512.  
  513.     if( kobj == phaseDelayNumId )
  514.     {
  515.         MMI_SendMessage( kobj, MM_GETNUMBOX, 5,
  516.                             &var2, &min2, &max2, &delta2, &ptColumn2 ) ;
  517.         MMI_SendMessage( phaseDelayVolumeId, MM_GETSCROLL, 5,
  518.                                         &var, &min, &max, &len, &page ) ;
  519.         MMI_SendMessage( phaseDelayVolumeId, MM_SETSCROLL, 5,
  520.                                         var2/2, min, max, len, page ) ;
  521.         MMI_SendMessage( phaseDelayVolumeId, MM_SHOW, 0 ) ;
  522.     }
  523.  
  524.     return NOERR ;
  525. }
  526.  
  527. /*    initDataIOTPHA:phaseMainMixVolumeId:MJ_SCRLL40の呼び出し関数    */
  528. /*    initDataIOTPHA:phaseMainMixNumId:MJ_NUMBOXL40の呼び出し関数    */
  529. int    phaseMainMixSet(kobj, messId, argc, pev, trigger)
  530. int        kobj ;
  531. int        messId ;
  532. int        argc ;
  533. EVENT    *pev ;
  534. int        trigger ;
  535. {
  536.     int    var, min, max, len, page ;            /* スクロールの変数 */
  537.     int    var2, min2, max2, delta2, ptColumn2 ;    /* 数値設定の変数 */
  538.  
  539.     if( kobj == phaseMainMixVolumeId )
  540.     {
  541.         MMI_SendMessage( kobj, MM_GETSCROLL, 5,
  542.                                         &var, &min, &max, &len, &page ) ;
  543.         MMI_SendMessage( phaseMainMixNumId, MM_GETNUMBOX, 5,
  544.                             &var2, &min2, &max2, &delta2, &ptColumn2 ) ;
  545.         MMI_SendMessage( phaseMainMixNumId, MM_SETNUMBOX, 5,
  546.                             var, min2, max2, delta2, ptColumn2 ) ;
  547.         MMI_SendMessage( phaseMainMixNumId, MM_SHOW, 0 ) ;
  548.     }
  549.  
  550.     if( kobj == phaseMainMixNumId )
  551.     {
  552.         MMI_SendMessage( kobj, MM_GETNUMBOX, 5,
  553.                             &var2, &min2, &max2, &delta2, &ptColumn2 ) ;
  554.         MMI_SendMessage( phaseMainMixVolumeId, MM_GETSCROLL, 5,
  555.                                         &var, &min, &max, &len, &page ) ;
  556.         MMI_SendMessage( phaseMainMixVolumeId, MM_SETSCROLL, 5,
  557.                                         var2, min, max, len, page ) ;
  558.         MMI_SendMessage( phaseMainMixVolumeId, MM_SHOW, 0 ) ;
  559.     }
  560.  
  561.     return NOERR ;
  562. }
  563.  
  564. /*    initDataIOTPHA:phaseDelayMixVolumeId:MJ_SCRLL40の呼び出し関数    */
  565. /*    initDataIOTPHA:phaseDelayMixNumId:MJ_NUMBOXL40の呼び出し関数    */
  566. int    phaseDelayMixSet(kobj, messId, argc, pev, trigger)
  567. int        kobj ;
  568. int        messId ;
  569. int        argc ;
  570. EVENT    *pev ;
  571. int        trigger ;
  572. {
  573.     int    var, min, max, len, page ;            /* スクロールの変数 */
  574.     int    var2, min2, max2, delta2, ptColumn2 ;    /* 数値設定の変数 */
  575.  
  576.     if( kobj == phaseDelayMixVolumeId )
  577.     {
  578.         MMI_SendMessage( kobj, MM_GETSCROLL, 5,
  579.                                         &var, &min, &max, &len, &page ) ;
  580.         MMI_SendMessage( phaseDelayMixNumId, MM_GETNUMBOX, 5,
  581.                             &var2, &min2, &max2, &delta2, &ptColumn2 ) ;
  582.         MMI_SendMessage( phaseDelayMixNumId, MM_SETNUMBOX, 5,
  583.                             var, min2, max2, delta2, ptColumn2 ) ;
  584.         MMI_SendMessage( phaseDelayMixNumId, MM_SHOW, 0 ) ;
  585.     }
  586.  
  587.     if( kobj == phaseDelayMixNumId )
  588.     {
  589.         MMI_SendMessage( kobj, MM_GETNUMBOX, 5,
  590.                             &var2, &min2, &max2, &delta2, &ptColumn2 ) ;
  591.         MMI_SendMessage( phaseDelayMixVolumeId, MM_GETSCROLL, 5,
  592.                                         &var, &min, &max, &len, &page ) ;
  593.         MMI_SendMessage( phaseDelayMixVolumeId, MM_SETSCROLL, 5,
  594.                                         var2, min, max, len, page ) ;
  595.         MMI_SendMessage( phaseDelayMixVolumeId, MM_SHOW, 0 ) ;
  596.     }
  597.  
  598.     return NOERR ;
  599. }
  600.  
  601. /*    initDataIOTPHA:phaseUndoBtnId:MJ_DBUTTONL40の呼び出し関数    */
  602. int    phaseUndo(kobj, messId, argc, pev, trigger)
  603. int        kobj ;
  604. int        messId ;
  605. int        argc ;
  606. EVENT    *pev ;
  607. int        trigger ;
  608. {
  609.     setMsgColor( phaseMesId[2], EXE_COLOR ) ;
  610.  
  611.     unDo() ;
  612.  
  613.     setMsgColor( phaseMesId[2], MOJI_COLOR ) ;
  614.  
  615.     MMI_FlushEvnt() ;    /* イベントをフラッシュ */
  616.  
  617.     return NOERR ;
  618. }
  619.  
  620. /*    initDataIOTPHA:phaseInfBtnId:MJ_DBUTTONL40の呼び出し関数    */
  621. int    phaseInf(kobj, messId, argc, pev, trigger)
  622. int        kobj ;
  623. int        messId ;
  624. int        argc ;
  625. EVENT    *pev ;
  626. int        trigger ;
  627. {
  628.     /* ダイアログを使えないようにする */
  629.     MTL_setAtrObj( phaseDialogId, MS_DSPONLYL40 ) ;
  630.  
  631.     sndInf() ;
  632.  
  633.     /* ダイアログを使えるように戻す */
  634.     MTL_resetAtrObj( phaseDialogId, (~MS_DSPONLYL40) ) ;
  635.     return NOERR ;
  636. }
  637.  
  638.  
  639. /* VIBRATO */
  640.  
  641. int    sndEffectVibrato()
  642. {
  643.     MMI_SendMessage( vibraDialogId, MM_ATTACH, 1, MMI_GetBaseObj() ) ;
  644.     MMI_SendMessage( vibraDialogId, MM_SHOW, 0 ) ;    /* 全体を見せる */
  645.  
  646.     MMI_ExecSystem() ;        /* Dialog表示へ・・・イベントループ */
  647.  
  648.     MMI_SendMessage( vibraDialogId, MM_ERASE, 0 ) ;
  649.     MMI_SendMessage( vibraDialogId, MM_DETACH, 0 ) ;
  650.  
  651.     return NOERR ;
  652. }
  653.  
  654. /*    initDataIOTVIB:vibraOkBtnId:MJ_DBUTTONL40の呼び出し関数    */
  655. int    vibraOkchk(kobj, messId, argc, pev, trigger)
  656. int        kobj ;
  657. int        messId ;
  658. int        argc ;
  659. EVENT    *pev ;
  660. int        trigger ;
  661. {
  662.     SNDHEAD *head ;
  663.     char para[64] ;
  664.     char work[512] ;
  665.     int    var, min, max, delta, ptColumn ;
  666.     int modu1, modu2 ;
  667.     int d, f, s ;
  668.  
  669.     setMsgColor( vibraMesId[0], EXE_COLOR ) ;
  670.  
  671.     head = (SNDHEAD *)sndBuf2 ;
  672.  
  673.     MMI_SendMessage( vibraMainMixNumId, MM_GETNUMBOX, 5,    /* main mix */
  674.                         &var, &min, &max, &delta, &ptColumn ) ;
  675.     DWORD( para + 8 ) = var * 256 / 100 ;
  676.     MMI_SendMessage( vibraDelayMixNumId, MM_GETNUMBOX, 5,    /* delay mix */
  677.                         &var, &min, &max, &delta, &ptColumn ) ;
  678.     DWORD( para + 12 ) = var * 256 / 100 ;
  679.     MMI_SendMessage( vibraModu1NumId, MM_GETNUMBOX, 5,        /* modu1 */
  680.                         &var, &min, &max, &delta, &ptColumn ) ;
  681.     d = var ;
  682.     MMI_SendMessage( vibraSpeed1NumId, MM_GETNUMBOX, 5,        /* speed1 */
  683.                         &var, &min, &max, &delta, &ptColumn ) ;
  684.     f = var ;
  685.     MMI_SendMessage( vibraStart1NumId, MM_GETNUMBOX, 5,        /* start1 */
  686.                         &var, &min, &max, &delta, &ptColumn ) ;
  687.     s = var ;
  688.     modu1 = .05946 * (head->freq * 1000 / 0x62) * d
  689.                                          / ( 2 * 3.14 * f / 10 * 100 ) ;
  690.     DWORD( para + 16 ) = modu1 ;
  691.     DWORD( para + 20 )
  692.     = (double)f / 10 * 65535 * 4 / (head->freq * 1000 / 0x62) ;
  693.     DWORD( para + 24 ) = 65536 * s / 90 + 65536 * 3 ;    /* 270°先送り */
  694.  
  695.  
  696.  
  697.     MMI_SendMessage( vibraModu2NumId, MM_GETNUMBOX, 5,        /* modu2 */
  698.                         &var, &min, &max, &delta, &ptColumn ) ;
  699.     d = var ;
  700.     MMI_SendMessage( vibraSpeed2NumId, MM_GETNUMBOX, 5,        /* speed2 */
  701.                         &var, &min, &max, &delta, &ptColumn ) ;
  702.     f = var ;
  703.     MMI_SendMessage( vibraStart2NumId, MM_GETNUMBOX, 5,        /* start2 */
  704.                         &var, &min, &max, &delta, &ptColumn ) ;
  705.     s = var ;
  706.     modu2 = .05946 * (head->freq * 1000 / 0x62) * d
  707.                                          / ( 2 * 3.14 * f / 10 * 100 ) ;
  708.     DWORD( para + 28 ) = modu2 ;
  709.     DWORD( para + 32 )
  710.     = (double)f / 10 * 65535 * 4 / (head->freq * 1000 / 0x62) ;
  711.     DWORD( para + 36 ) = 65536 * s / 90 + 65536 * 3 ;    /* 270°先送り */
  712.  
  713.     DWORD( para + 0 ) = 0 ;                                /* main delay */
  714.     DWORD( para + 4 ) = modu1 + modu2 ;                    /* phase delay */
  715.  
  716.     sndPhaseDelay( sndBuf2, sndBuf1, para, work ) ;
  717.  
  718.     setMsgColor( vibraMesId[0], MOJI_COLOR ) ;
  719.  
  720.     MMI_FlushEvnt() ;    /* イベントをフラッシュ */
  721.  
  722.     return NOERR ;
  723. }
  724.  
  725. /*    initDataIOTVIB:vibraPlayBtnId:MJ_DBUTTONL40の呼び出し関数    */
  726. int    vibraPlay(kobj, messId, argc, pev, trigger)
  727. int        kobj ;
  728. int        messId ;
  729. int        argc ;
  730. EVENT    *pev ;
  731. int        trigger ;
  732. {
  733.     setMsgColor( vibraMesId[1], EXE_COLOR ) ;
  734.  
  735.     sndPlay() ;
  736.  
  737.     setMsgColor( vibraMesId[1], MOJI_COLOR ) ;
  738.  
  739.     return NOERR ;
  740. }
  741.  
  742. /*    initDataIOTVIB:vibraUndoBtnId:MJ_DBUTTONL40の呼び出し関数    */
  743. int    vibraUndo(kobj, messId, argc, pev, trigger)
  744. int        kobj ;
  745. int        messId ;
  746. int        argc ;
  747. EVENT    *pev ;
  748. int        trigger ;
  749. {
  750.     setMsgColor( vibraMesId[2], EXE_COLOR ) ;
  751.  
  752.     unDo() ;
  753.  
  754.     setMsgColor( vibraMesId[2], MOJI_COLOR ) ;
  755.  
  756.     MMI_FlushEvnt() ;    /* イベントをフラッシュ */
  757.  
  758.     return NOERR ;
  759. }
  760.  
  761. /*    initDataIOTVIB:vibraInfBtnId:MJ_DBUTTONL40の呼び出し関数    */
  762. int    vibraInf(kobj, messId, argc, pev, trigger)
  763. int        kobj ;
  764. int        messId ;
  765. int        argc ;
  766. EVENT    *pev ;
  767. int        trigger ;
  768. {
  769.     /* ダイアログを使えないようにする */
  770.     MTL_setAtrObj( vibraDialogId, MS_DSPONLYL40 ) ;
  771.  
  772.     sndInf() ;
  773.  
  774.     /* ダイアログを使えるように戻す */
  775.     MTL_resetAtrObj( vibraDialogId, (~MS_DSPONLYL40) ) ;
  776.  
  777.     return NOERR ;
  778. }
  779.  
  780. /*    initDataIOTVIB:vibraCanBtnId:MJ_DBUTTONL40の呼び出し関数    */
  781. int    vibraCanchk(kobj, messId, argc, pev, trigger)
  782. int        kobj ;
  783. int        messId ;
  784. int        argc ;
  785. EVENT    *pev ;
  786. int        trigger ;
  787. {
  788.     MMI_SetHaltFlag( TRUE ) ;
  789.     return NOERR ;
  790. }
  791.  
  792. /*    initDataIOTVIB:vibraMainMixVolumeId:MJ_SCRLL40の呼び出し関数    */
  793. /*    initDataIOTVIB:vibraMainMixNumId:MJ_NUMBOXL40の呼び出し関数    */
  794. int    vibraMainMixSet(kobj, messId, argc, pev, trigger)
  795. int        kobj ;
  796. int        messId ;
  797. int        argc ;
  798. EVENT    *pev ;
  799. int        trigger ;
  800. {
  801.     int    var, min, max, len, page ;            /* スクロールの変数 */
  802.     int    var2, min2, max2, delta2, ptColumn2 ;    /* 数値設定の変数 */
  803.  
  804.     if( kobj == vibraMainMixVolumeId )
  805.     {
  806.         MMI_SendMessage( kobj, MM_GETSCROLL, 5,
  807.                                         &var, &min, &max, &len, &page ) ;
  808.         MMI_SendMessage( vibraMainMixNumId, MM_GETNUMBOX, 5,
  809.                             &var2, &min2, &max2, &delta2, &ptColumn2 ) ;
  810.         MMI_SendMessage( vibraMainMixNumId, MM_SETNUMBOX, 5,
  811.                             var, min2, max2, delta2, ptColumn2 ) ;
  812.         MMI_SendMessage( vibraMainMixNumId, MM_SHOW, 0 ) ;
  813.     }
  814.  
  815.     if( kobj == vibraMainMixNumId )
  816.     {
  817.         MMI_SendMessage( kobj, MM_GETNUMBOX, 5,
  818.                             &var2, &min2, &max2, &delta2, &ptColumn2 ) ;
  819.         MMI_SendMessage( vibraMainMixVolumeId, MM_GETSCROLL, 5,
  820.                                         &var, &min, &max, &len, &page ) ;
  821.         MMI_SendMessage( vibraMainMixVolumeId, MM_SETSCROLL, 5,
  822.                                         var2, min, max, len, page ) ;
  823.         MMI_SendMessage( vibraMainMixVolumeId, MM_SHOW, 0 ) ;
  824.     }
  825.  
  826.     return NOERR ;
  827. }
  828.  
  829. /*    initDataIOTVIB:vibraDelayMixVolumeId:MJ_SCRLL40の呼び出し関数    */
  830. /*    initDataIOTVIB:vibraDelayMixNumId:MJ_NUMBOXL40の呼び出し関数    */
  831. int    vibraDelayMixSet(kobj, messId, argc, pev, trigger)
  832. int        kobj ;
  833. int        messId ;
  834. int        argc ;
  835. EVENT    *pev ;
  836. int        trigger ;
  837. {
  838.     int    var, min, max, len, page ;            /* スクロールの変数 */
  839.     int    var2, min2, max2, delta2, ptColumn2 ;    /* 数値設定の変数 */
  840.  
  841.     if( kobj == vibraDelayMixVolumeId )
  842.     {
  843.         MMI_SendMessage( kobj, MM_GETSCROLL, 5,
  844.                                         &var, &min, &max, &len, &page ) ;
  845.         MMI_SendMessage( vibraDelayMixNumId, MM_GETNUMBOX, 5,
  846.                             &var2, &min2, &max2, &delta2, &ptColumn2 ) ;
  847.         MMI_SendMessage( vibraDelayMixNumId, MM_SETNUMBOX, 5,
  848.                             var, min2, max2, delta2, ptColumn2 ) ;
  849.         MMI_SendMessage( vibraDelayMixNumId, MM_SHOW, 0 ) ;
  850.     }
  851.  
  852.     if( kobj == vibraDelayMixNumId )
  853.     {
  854.         MMI_SendMessage( kobj, MM_GETNUMBOX, 5,
  855.                             &var2, &min2, &max2, &delta2, &ptColumn2 ) ;
  856.         MMI_SendMessage( vibraDelayMixVolumeId, MM_GETSCROLL, 5,
  857.                                         &var, &min, &max, &len, &page ) ;
  858.         MMI_SendMessage( vibraDelayMixVolumeId, MM_SETSCROLL, 5,
  859.                                         var2, min, max, len, page ) ;
  860.         MMI_SendMessage( vibraDelayMixVolumeId, MM_SHOW, 0 ) ;
  861.     }
  862.  
  863.     return NOERR ;
  864. }
  865.  
  866.  
  867. /* TREMOLO */
  868.  
  869. int    sndEffectTremolo()
  870. {
  871.     MMI_SendMessage( tremoDialogId, MM_ATTACH, 1, MMI_GetBaseObj() ) ;
  872.     MMI_SendMessage( tremoDialogId, MM_SHOW, 0 ) ;    /* 全体を見せる */
  873.  
  874.     MMI_ExecSystem() ;        /* Dialog表示へ・・・イベントループ */
  875.  
  876.     MMI_SendMessage( tremoDialogId, MM_ERASE, 0 ) ;
  877.     MMI_SendMessage( tremoDialogId, MM_DETACH, 0 ) ;
  878.  
  879.     return NOERR ;
  880. }
  881.  
  882. /*    initDataIOTTRE:tremoOkBtnId:MJ_DBUTTONL40の呼び出し関数    */
  883. int    tremoOkchk(kobj, messId, argc, pev, trigger)
  884. int        kobj ;
  885. int        messId ;
  886. int        argc ;
  887. EVENT    *pev ;
  888. int        trigger ;
  889. {
  890.     SNDHEAD *head ;
  891.     char para[64] ;
  892.     char work[512] ;
  893.     int    var, min, max, delta, ptColumn ;
  894.  
  895.     setMsgColor( tremoMesId[0], EXE_COLOR ) ;
  896.  
  897.     unDo() ;
  898.  
  899.     head = (SNDHEAD *)sndBuf2 ;
  900.  
  901.     MMI_SendMessage( tremoMainMixNumId, MM_GETNUMBOX, 5,    /* main mix */
  902.                         &var, &min, &max, &delta, &ptColumn ) ;
  903.     DWORD( para + 0 ) = var * 256 / 100 ;
  904.     MMI_SendMessage( tremoTremoMixNumId, MM_GETNUMBOX, 5,    /* tremo mix */
  905.                         &var, &min, &max, &delta, &ptColumn ) ;
  906.     DWORD( para + 4 ) = var * 256 / 100 ;
  907.     MMI_SendMessage( tremoSpeedNumId, MM_GETNUMBOX, 5,        /* speed */
  908.                         &var, &min, &max, &delta, &ptColumn ) ;
  909.     DWORD( para + 8 )
  910.     = (double)var / 10 * 65536 * 4 / (head->freq * 1000 / 0x62) ;
  911.  
  912.     DWORD( para + 12 ) = 0 ;
  913.  
  914.     sndTremolo( sndBuf1, para, work ) ;
  915.  
  916.     setMsgColor( tremoMesId[0], MOJI_COLOR ) ;
  917.  
  918.     MMI_FlushEvnt() ;    /* イベントをフラッシュ */
  919.  
  920.     return NOERR ;
  921. }
  922.  
  923. /*    initDataIOTTRE:tremoPlayBtnId:MJ_DBUTTONL40の呼び出し関数    */
  924. int    tremoPlay(kobj, messId, argc, pev, trigger)
  925. int        kobj ;
  926. int        messId ;
  927. int        argc ;
  928. EVENT    *pev ;
  929. int        trigger ;
  930. {
  931.     setMsgColor( tremoMesId[1], EXE_COLOR ) ;
  932.  
  933.     sndPlay() ;
  934.  
  935.     setMsgColor( tremoMesId[1], MOJI_COLOR ) ;
  936.  
  937.     return NOERR ;
  938. }
  939.  
  940. /*    initDataIOTTRE:tremoUndoBtnId:MJ_DBUTTONL40の呼び出し関数    */
  941. int    tremoUndo(kobj, messId, argc, pev, trigger)
  942. int        kobj ;
  943. int        messId ;
  944. int        argc ;
  945. EVENT    *pev ;
  946. int        trigger ;
  947. {
  948.     setMsgColor( tremoMesId[2], EXE_COLOR ) ;
  949.  
  950.     unDo() ;
  951.  
  952.     setMsgColor( tremoMesId[2], MOJI_COLOR ) ;
  953.  
  954.     MMI_FlushEvnt() ;    /* イベントをフラッシュ */
  955.  
  956.     return NOERR ;
  957. }
  958.  
  959. /*    initDataIOTTRE:tremoInfBtnId:MJ_DBUTTONL40の呼び出し関数    */
  960. int    tremoInf(kobj, messId, argc, pev, trigger)
  961. int        kobj ;
  962. int        messId ;
  963. int        argc ;
  964. EVENT    *pev ;
  965. int        trigger ;
  966. {
  967.     /* ダイアログを使えないようにする */
  968.     MTL_setAtrObj( tremoDialogId, MS_DSPONLYL40 ) ;
  969.  
  970.     sndInf() ;
  971.  
  972.     /* ダイアログを使えるように戻す */
  973.     MTL_resetAtrObj( tremoDialogId, (~MS_DSPONLYL40) ) ;
  974.  
  975.     return NOERR ;
  976. }
  977.  
  978. /*    initDataIOTTRE:tremoCanBtnId:MJ_DBUTTONL40の呼び出し関数    */
  979. int    tremoCanchk(kobj, messId, argc, pev, trigger)
  980. int        kobj ;
  981. int        messId ;
  982. int        argc ;
  983. EVENT    *pev ;
  984. int        trigger ;
  985. {
  986.     MMI_SetHaltFlag( TRUE ) ;
  987.     return NOERR ;
  988. }
  989.  
  990. /*    initDataIOTTRE:tremoMainMixVolumeId:MJ_SCRLL40の呼び出し関数    */
  991. /*    initDataIOTTRE:tremoMainMixNumId:MJ_NUMBOXL40の呼び出し関数    */
  992. int    tremoMainMixSet(kobj, messId, argc, pev, trigger)
  993. int        kobj ;
  994. int        messId ;
  995. int        argc ;
  996. EVENT    *pev ;
  997. int        trigger ;
  998. {
  999.     int    var, min, max, len, page ;            /* スクロールの変数 */
  1000.     int    var2, min2, max2, delta2, ptColumn2 ;    /* 数値設定の変数 */
  1001.  
  1002.     if( kobj == tremoMainMixVolumeId )
  1003.     {
  1004.         MMI_SendMessage( kobj, MM_GETSCROLL, 5,
  1005.                                         &var, &min, &max, &len, &page ) ;
  1006.         MMI_SendMessage( tremoMainMixNumId, MM_GETNUMBOX, 5,
  1007.                             &var2, &min2, &max2, &delta2, &ptColumn2 ) ;
  1008.         MMI_SendMessage( tremoMainMixNumId, MM_SETNUMBOX, 5,
  1009.                             var, min2, max2, delta2, ptColumn2 ) ;
  1010.         MMI_SendMessage( tremoMainMixNumId, MM_SHOW, 0 ) ;
  1011.     }
  1012.  
  1013.     if( kobj == tremoMainMixNumId )
  1014.     {
  1015.         MMI_SendMessage( kobj, MM_GETNUMBOX, 5,
  1016.                             &var2, &min2, &max2, &delta2, &ptColumn2 ) ;
  1017.         MMI_SendMessage( tremoMainMixVolumeId, MM_GETSCROLL, 5,
  1018.                                         &var, &min, &max, &len, &page ) ;
  1019.         MMI_SendMessage( tremoMainMixVolumeId, MM_SETSCROLL, 5,
  1020.                                         var2, min, max, len, page ) ;
  1021.         MMI_SendMessage( tremoMainMixVolumeId, MM_SHOW, 0 ) ;
  1022.     }
  1023.  
  1024.     return NOERR ;
  1025. }
  1026.  
  1027. /*    initDataIOTTRE:tremoTremoMixVolumeId:MJ_SCRLL40の呼び出し関数    */
  1028. /*    initDataIOTTRE:tremoTremoMixNumId:MJ_NUMBOXL40の呼び出し関数    */
  1029. int    tremoTremoMixSet(kobj, messId, argc, pev, trigger)
  1030. int        kobj ;
  1031. int        messId ;
  1032. int        argc ;
  1033. EVENT    *pev ;
  1034. int        trigger ;
  1035. {
  1036.     int    var, min, max, len, page ;            /* スクロールの変数 */
  1037.     int    var2, min2, max2, delta2, ptColumn2 ;    /* 数値設定の変数 */
  1038.  
  1039.     if( kobj == tremoTremoMixVolumeId )
  1040.     {
  1041.         MMI_SendMessage( kobj, MM_GETSCROLL, 5,
  1042.                                         &var, &min, &max, &len, &page ) ;
  1043.         MMI_SendMessage( tremoTremoMixNumId, MM_GETNUMBOX, 5,
  1044.                             &var2, &min2, &max2, &delta2, &ptColumn2 ) ;
  1045.         MMI_SendMessage( tremoTremoMixNumId, MM_SETNUMBOX, 5,
  1046.                             var, min2, max2, delta2, ptColumn2 ) ;
  1047.         MMI_SendMessage( tremoTremoMixNumId, MM_SHOW, 0 ) ;
  1048.     }
  1049.  
  1050.     if( kobj == tremoTremoMixNumId )
  1051.     {
  1052.         MMI_SendMessage( kobj, MM_GETNUMBOX, 5,
  1053.                             &var2, &min2, &max2, &delta2, &ptColumn2 ) ;
  1054.         MMI_SendMessage( tremoTremoMixVolumeId, MM_GETSCROLL, 5,
  1055.                                         &var, &min, &max, &len, &page ) ;
  1056.         MMI_SendMessage( tremoTremoMixVolumeId, MM_SETSCROLL, 5,
  1057.                                         var2, min, max, len, page ) ;
  1058.         MMI_SendMessage( tremoTremoMixVolumeId, MM_SHOW, 0 ) ;
  1059.     }
  1060.  
  1061.     return NOERR ;
  1062. }
  1063.  
  1064. /*    initDataIOTTRE:tremoSpeedNumId:MJ_NUMBOXL40の呼び出し関数    */
  1065. /*    initDataIOTTRE:tremoSpeedVolumeId:MJ_SCRLL40の呼び出し関数    */
  1066. int    tremoSpeedSet(kobj, messId, argc, pev, trigger)
  1067. int        kobj ;
  1068. int        messId ;
  1069. int        argc ;
  1070. EVENT    *pev ;
  1071. int        trigger ;
  1072. {
  1073.     /* ボリュームは1/2 */
  1074.  
  1075.     int    var, min, max, len, page ;            /* スクロールの変数 */
  1076.     int    var2, min2, max2, delta2, ptColumn2 ;    /* 数値設定の変数 */
  1077.  
  1078.     if( kobj == tremoSpeedVolumeId )
  1079.     {
  1080.         MMI_SendMessage( kobj, MM_GETSCROLL, 5,
  1081.                                         &var, &min, &max, &len, &page ) ;
  1082.         MMI_SendMessage( tremoSpeedNumId, MM_GETNUMBOX, 5,
  1083.                             &var2, &min2, &max2, &delta2, &ptColumn2 ) ;
  1084.         MMI_SendMessage( tremoSpeedNumId, MM_SETNUMBOX, 5,
  1085.                             var*2, min2, max2, delta2, ptColumn2 ) ;
  1086.         MMI_SendMessage( tremoSpeedNumId, MM_SHOW, 0 ) ;
  1087.     }
  1088.  
  1089.     if( kobj == tremoSpeedNumId )
  1090.     {
  1091.         MMI_SendMessage( kobj, MM_GETNUMBOX, 5,
  1092.                             &var2, &min2, &max2, &delta2, &ptColumn2 ) ;
  1093.         MMI_SendMessage( tremoSpeedVolumeId, MM_GETSCROLL, 5,
  1094.                                         &var, &min, &max, &len, &page ) ;
  1095.         MMI_SendMessage( tremoSpeedVolumeId, MM_SETSCROLL, 5,
  1096.                                         var2/2, min, max, len, page ) ;
  1097.         MMI_SendMessage( tremoSpeedVolumeId, MM_SHOW, 0 ) ;
  1098.     }
  1099.  
  1100.     return NOERR ;
  1101. }
  1102.  
  1103.  
  1104. /* これ以後は, このソースのCによる音声処理ルーチン */
  1105.  
  1106. /***** エコールーチン *****/
  1107. /* 遅れ, メインmixrate, 初期減衰率, 減衰率, 減衰処理count, 余韻バイト数 */
  1108. /* rateや率は0~256 */
  1109. sndEcho( delay, mrate, fdec, dec, count, after )
  1110. int delay ;
  1111. int mrate ;
  1112. int fdec ;
  1113. int dec ;
  1114. int count ;
  1115. int after ;
  1116. {
  1117.     SNDHEAD *head1, *head2 ;
  1118.  
  1119.     int i, j ;
  1120.     int len0, len1 ;
  1121.     int del, d, x ;
  1122.     char *source, *new ;
  1123.     int decr[101] ;
  1124.  
  1125.     head1 = (SNDHEAD *)sndBuf1 ;
  1126.     head2 = (SNDHEAD *)sndBuf2 ;
  1127.  
  1128.     len0 = head2->length ;
  1129.     len1 = len0 + after ;    /* after = 余韻 */
  1130.     if( len1 > sndBufSize-32 )
  1131.         return OUT_OF_MEMORY ;
  1132.  
  1133.     head1->length = len1 ;
  1134.     source = sndBuf2 + 32 ;
  1135.     new = sndBuf1 + 32 ;
  1136.  
  1137.     if( count > 100 )
  1138.         count = 100 ;
  1139.     decr[1] = fdec ;
  1140.     for( i=2 ; i<=count ; i++ )
  1141.     {
  1142.         decr[i] = ( decr[i-1] * dec ) >> 8 ;
  1143.     }
  1144.  
  1145.     for( i=0 ; i<len1 ; i++ )
  1146.     {
  1147.         del = 0 ;
  1148.         for( j=1 ; j<=count ; j++ )
  1149.         {
  1150.             if( (i-delay*j >= 0) && (i-delay*j < len0) )
  1151.             {
  1152.                 d = source[i-delay*j] ;
  1153.                 d &= 0xff ;
  1154.                 if( d >= 128 )
  1155.                     d = 128 - d ;
  1156.                 d = d * decr[j] ;
  1157.                 del += d ;
  1158.             }
  1159.         }
  1160.  
  1161.         x = 0 ;
  1162.         if( i < len0 )
  1163.         {
  1164.             x = source[i] ;
  1165.             x &= 0xff ;
  1166.             if( x >= 128 )
  1167.                 x = 128 - x ;
  1168.             x = x * mrate ;
  1169.         }
  1170.         x = ( x + del ) >> 8 ;
  1171.         if( x <= 0 )
  1172.         {
  1173.             x = 128 - x ;
  1174.             if( x > 254 )
  1175.                 x = 254 ;
  1176.         }
  1177.         else if( x > 127 )
  1178.             x = 127 ;
  1179.  
  1180.         new[i] = x ;
  1181.     }
  1182.  
  1183.     return NOERR ;
  1184. }
  1185.  
  1186.  
  1187.